home *** CD-ROM | disk | FTP | other *** search
/ Garden Fax: Indoor Plants / Garden Fax - Indoor Plants (1991)(CDTV Publishing)[!].iso / system / basicdemos / screenprint (.txt) < prev    next >
AmigaBASIC Source Code  |  1991-04-17  |  5KB  |  213 lines

  1. REM  ScreenPrint
  2. REM  Carolyn Scheppner   CBM  04/86
  3. REM
  4. REM  Graphic screen dump to the printer
  5. REM   using exec library calls
  6. REM  Requires exec.bmap
  7. REM  Use Preferences to select options
  8. REM   such as GrayScale and Negative
  9.  
  10. REM  ***  Calling Program  ***
  11.  
  12. REM  Custom Screen, some graphics
  13. w = 320: h = 200: d = 5
  14. SCREEN 1,w,h,d,1
  15. t$=" D = Draw   P = Print   Q = Quit "
  16. WINDOW 1,t$,,7,1
  17. PALETTE 0,1,1,1
  18. PALETTE 1,0.2,0.4,0.8
  19.  
  20. GOSUB DrawLines:
  21.  
  22. MainLoop:
  23. k$ = INKEY$
  24. IF k$ = "d" THEN 
  25.    GOSUB DrawLines:
  26. ELSEIF k$ = "p" THEN
  27.    BorderFlag% = 0  'No borders printed
  28.    GOSUB ScreenDump
  29.    REM  Time to read any error msgs
  30.    FOR de = 1 TO 5000: NEXT
  31. ELSEIF k$ = "q" THEN 
  32.    GOTO Quit:
  33. END IF
  34. GOTO MainLoop:
  35.  
  36. Quit:
  37. WINDOW CLOSE 1
  38. SCREEN CLOSE 1
  39. WINDOW 1,"ScreenPrint",,,-1
  40. END
  41.  
  42.  
  43. DrawLines:
  44. CLS               
  45. RANDOMIZE  TIMER
  46. FOR k = 1 TO 12
  47.    x1 = 80 + INT(RND(1) * (w - 160)) 
  48.    x2 = 80 + INT(RND(1) * (w - 160))
  49.    y1 = 40 + INT(RND(1) * (h - 100))
  50.    y2 = 40 + INT(RND(1) * (h - 100))
  51.    dx = 2 + INT(RND(1) * 3)
  52.    IF RND(1) < 0.5 THEN dx = -dx
  53.    dy = 2 + INT(RND(1) * 2)
  54.    IF RND(1) < 0.5 THEN dy = -dy
  55.    co = 1 + INT(RND(1) * 16)
  56.    nl = 12 + INT(RND(1) * 10) 
  57.    FOR j = 1 TO nl
  58.       LINE (x1,y1)-(x2,y2),co
  59.       x1 = x1 + dx
  60.       x2 = x2 + dx
  61.       y1 = y1 + dy
  62.       y2 = y2 - dy
  63.    NEXT
  64. NEXT
  65. RETURN
  66.  
  67.  
  68. END
  69.  
  70.  
  71. ScreenDump:
  72.  
  73. REM  If first call of this routine 
  74. REM   declare the exec library functions
  75. REM    which return values
  76.  
  77. IF AlreadyDeclared = 0 THEN
  78.  DECLARE FUNCTION AllocSignal%() LIBRARY
  79.  DECLARE FUNCTION AllocMem&()    LIBRARY
  80.  DECLARE FUNCTION FindTask&()    LIBRARY
  81.  DECLARE FUNCTION DoIO&()        LIBRARY
  82.  DECLARE FUNCTION OpenDevice&    LIBRARY
  83.  AlreadyDeclared = 1
  84. END IF
  85.  
  86. REM  Get addresses of the structures
  87.  
  88. sWindow&   = WINDOW(7)
  89. sScreen&   = PEEKL(sWindow& + 46)
  90. sViewPort& = sScreen& + 44
  91. sRastPort& = sScreen& + 84
  92. sColorMap& = PEEKL(sViewPort& + 4)
  93.  
  94. REM  Get Screen width, height, modes 
  95.  
  96. maxWidth%  = PEEKW(sScreen& + 12)
  97. maxHeight% = PEEKW(sScreen& + 14)
  98. viewModes% = PEEKW(sViewPort& + 32)
  99.  
  100. REM Set up parameters for dump command
  101.  
  102. command%  = 11   'Printer command number
  103. srcX% = 0        'Send whole screen
  104. srcY% = 0 
  105. srcWidth%  = maxWidth%
  106. srcHeight% = maxHeight%
  107. destRows& = 0    'Dump will compute
  108. destCols& = 0
  109. special% = &H84  'FullCol | Aspect
  110.  
  111. IF BorderFlag% = 0 THEN  'No Borders
  112.    srcX% = srcX% + 3
  113.    srcY% = srcY% + 11
  114.    srcWidth%  = srcWidth% - 3 - 11
  115.    srcHeight% = srcHeight% - 11 - 3
  116. END IF   
  117.  
  118. LIBRARY "exec.library"
  119.  
  120.  
  121. REM *** CreatePort ***
  122.  
  123. sigBit% =  AllocSignal%(-1)
  124. ClearPublic& = 65537
  125. msgPort& = AllocMem&(40,ClearPublic&)
  126. IF msgPort& = 0 THEN
  127.    PRINT "Can't allocate msgPort"
  128.    GOTO cleanup4
  129. END IF
  130.  
  131.  
  132. POKE(msgPort& + 8), 4 'Type=NT_MSGPORT
  133. POKE(msgPort& + 9), 0 'Priority 0 
  134. portName$ = "MyPrtPort"+CHR$(0)
  135. POKEL(msgPort& + 10), SADD(portName$)
  136. POKE(msgPort& + 14), 0 'Flags
  137. POKE(msgPort& + 15), sigBit%
  138. sigTask& = FindTask&(0)
  139. POKEL(msgPort& + 16), sigTask&
  140.  
  141. CALL AddPort(msgPort&)  'Add the port 
  142.  
  143.  
  144. REM  *** CreatExtIO ***
  145.  
  146. ioRequest& = AllocMem&(64,ClearPublic&)
  147. IF ioRequest& = 0  THEN
  148.    PRINT "Can't allocate ioRequest"
  149.    GOTO cleanup3
  150. END IF
  151.  
  152. POKE(ioRequest& + 8),5 'Type=NT_MESSAGE
  153. POKE(ioRequest& + 9),0 'Priority 0
  154. POKEL(ioRequest& + 14), msgPort&
  155.  
  156.  
  157. REM  *** Open the Printer Device ***
  158.  
  159. devName$ = "printer.device"+CHR$(0)
  160. pError& = OpenDevice&(SADD(devName$),0,ioRequest&,0)
  161. IF pError& <> 0  THEN
  162.    PRINT "Can't open printer"
  163.    GOTO cleanup2
  164. END IF
  165.  
  166.  
  167. REM  *** Dump the RastPort ***
  168.  
  169. POKEW(ioRequest& + 28), command%
  170. POKEL(ioRequest& + 32), sRastPort&
  171. POKEL(ioRequest& + 36), sColorMap&
  172. POKEL(ioRequest& + 40), viewModes%
  173. POKEW(ioRequest& + 44), srcX%
  174. POKEW(ioRequest& + 46), srcY%
  175. POKEW(ioRequest& + 48), srcWidth%
  176. POKEW(ioRequest& + 50), srcHeight%
  177. POKEL(ioRequest& + 52), destCols&
  178. POKEL(ioRequest& + 56), destRows&
  179. POKEW(ioRequest& + 60), special%
  180.  
  181. ioError& = DoIO&(ioRequest&)
  182. IF ioError& <> 0 THEN
  183.    PRINT "DumpRPort error =" ioError&
  184.    GOTO cleanup1
  185. END IF
  186.  
  187.  
  188. cleanup1:
  189.    REM  *** Close Printer Device ***
  190.    CALL CloseDevice(ioRequest&)
  191.  
  192. cleanup2:
  193.    REM  *** DeleteExtIO ***
  194.    POKE(ioRequest& + 8), &Hff
  195.    POKEL(ioRequest& + 20), -1
  196.    POKEL(ioRequest& + 24), -1
  197.    CALL FreeMem(ioRequest&,64)
  198.  
  199. cleanup3:
  200.    REM  *** DeletePort ***
  201.    CALL RemPort(msgPort&)
  202.    POKE(msgPort& + 8), &Hff  
  203.    POKEL(msgPort& + 20), -1
  204.    CALL FreeSignal(sigBit%)
  205.    CALL FreeMem(msgPort&,40)
  206.    
  207. cleanup4:   
  208.    LIBRARY CLOSE
  209.  
  210. RETURN
  211.    
  212.       
  213.